import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import org.junit.Before;
import org.junit.Test;

public class TestServeur {

	Serveur serveur;
	Transport trans1;
	Transport trans2;
	Transport trans3;
	Transport trans4;
	Trajet trajet1;
	Trajet trajet2;
	Trajet trajet3;
	Trajet trajet4;
	Date d1;
	Date d2;
	Date d3;
	Date d4;
	Passager p1;
	Passager p2;
	ArrayList<Passager> passagers;
	ArrayList<Trajet> trajets;
	ArrayList<Trajet> trajets2;
	
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		
		serveur = new Serveur();
		d1 = new Date(111, 10, 18, 12, 04);
		d2 = new Date(111, 11, 20, 12, 04);
		d3 = new Date(111, 10, 30, 14, 59);
		d4 = new Date(111, 12, 0, 1, 2);
		
		trajet1 = new Trajet(Villes.NEWYORK, Villes.PARIS, d1, d2);
		trajet2 = new Trajet(Villes.MARSEILLE, Villes.NICE, d3, d4);
		trajets = new ArrayList<Trajet>();	
		trajets.add(trajet1);
		trajets.add(trajet2);
		
		trajet3 = new Trajet(Villes.PARIS, Villes.NICE, d1, d3);
		trajet4 = new Trajet(Villes.MARSEILLE, Villes.PARIS, d2, d4);
		trajets2 = new ArrayList<Trajet>();
		trajets2.add(trajet3);
		trajets2.add(trajet4);
		
		p1 = new Passager("maugard", "matthieu");
		p2 = new Passager("paeta", "suzy");
		
		passagers = new ArrayList<Passager>();
		passagers.add(p1);
		passagers.add(p2);
		
		trans1 = new Transport("nom", 10, trajets, Types.AVION);
		trans2 = new Transport("bus1", 5, trajets2, Types.BUS);
		trans3 = new Transport("avion2", 20, trajets2, Types.AVION);
		trans4 = new Transport("train", 1, trajets, Types.TRAIN);
	}

	/**
	 * Test method for {@link Serveur#restePlaces(Transport)}.
	 */
	@Test
	public void testRestePlaces() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		trans.add(trans4);
		serveur.serialiser("fichier.ser", trans);
		assertTrue(serveur.restePlaces(trans4, trajet1));
	}

	/**
	 * Test method for {@link Serveur#deserialiser(java.lang.String)}.
	 */
	@Test
	public void testDeserialiser() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		serveur.serialiser("fichier.ser", trans);
		ArrayList<Transport> transDeserialise = serveur.deserialiser("fichier.ser");
		
		assertEquals(trans.size(), transDeserialise.size());
		assertEquals(trans.get(0).getNom(),transDeserialise.get(0).getNom());
		assertEquals(trans.get(1).getNom(),transDeserialise.get(1).getNom());
		
	}

	/**
	 * Test method for {@link Serveur#reservationObjet(Passager, Transport, java.util.Date, java.lang.String)}.
	 */
	@Test
	public void testReservationObjet() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		serveur.serialiser("fichier2.ser", trans);
		serveur.reservationObjet(p1, trans1, d1, "fichier2.ser");
		ArrayList<Transport> transDeserialise = serveur.deserialiser("fichier2.ser");
		
		int cap = 0;
		ArrayList<Trajet> trajetsTrans = trans1.getTrajets();
		for(int i=0; i<trajetsTrans.size(); i++){
			if(trajetsTrans.get(i).getDateDebut().equals(d1)){
				cap = trajetsTrans.get(i).getCapaciteCourante();
			}
		}
		
		int cap2=0;
		ArrayList<Trajet> trajetsTrans2 = transDeserialise.get(1).getTrajets();
		for(int i=0; i<trajetsTrans2.size(); i++){
			if(trajetsTrans2.get(i).getDateDebut().equals(d1)){
				cap = trajetsTrans2.get(i).getCapaciteCourante();
			}
		}
		assertEquals(cap, cap2);
		
	}

	/**
	 * Test method for {@link Serveur#getTransportsType(java.lang.String, Types)}.
	 */
	@Test
	public void testGetTransportsType() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		serveur.serialiser("fichier3.ser", trans);
		ArrayList<Transport> typesAvion = serveur.getTransportsType("fichier3.ser", Types.AVION);
		assertEquals(2, typesAvion.size());		
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesDepart(java.lang.String, Villes)}.
	 */
	@Test
	public void testGetTransportsVillesDepart() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		serveur.serialiser("fichier4.ser", trans);
		ArrayList<Trajet> marseille = serveur.getTransportsVillesDepart("fichier4.ser", Villes.MARSEILLE);
		assertEquals(3, marseille.size());	
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesArrivee(java.lang.String, Villes)}.
	 */
	@Test
	public void testGetTransportsVillesArrivee() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		serveur.serialiser("fichier5.ser", trans);
		ArrayList<Trajet> paris = serveur.getTransportsVillesArrivee("fichier5.ser", Villes.PARIS);
		assertEquals(3, paris.size());
	}

	/**
	 * Test method for {@link Serveur#getTransportsVilles(java.lang.String, Villes, Villes)}.
	 */
	@Test
	public void testGetTransportsVilles() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		serveur.serialiser("fichier6.ser", trans);
		ArrayList<Trajet> parisnice = serveur.getTransportsVilles("fichier6.ser", Villes.PARIS, Villes.NICE);
		assertEquals(2, parisnice.size());
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesDateDepart(java.lang.String, Villes, Villes, java.util.Date)}.
	 */
	@Test
	public void testGetTransportsVillesDateDepart() {
		ArrayList<Transport> trans = new ArrayList<Transport>();
		trans.add(trans1);
		trans.add(trans2);
		trans.add(trans3);
		serveur.serialiser("fichier7.ser", trans);
		ArrayList<Trajet> parisniced1 = serveur.getTransportsVillesDateDepart("fichier7.ser", Villes.PARIS, Villes.NICE,d1);
		assertEquals(2, parisniced1.size());
	}

	/**
	 * Test method for {@link Serveur#reconstruireTransports()}.
	 */
	@Test
	public void testReconstruireTransports() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);
		
		ArrayList<Transport> transports = serveur.reconstruireTransports();
		
		assertEquals(3, transports.size());
		assertEquals(trans1.getNom(), transports.get(0).getNom());
		assertEquals(trans2.getNom(), transports.get(1).getNom());
		assertEquals(trans3.getNom(), transports.get(2).getNom());
		
	}

	/**
	 * Test method for {@link Serveur#reservationFichier(Passager, Transport, java.util.Date)}.
	 */
	@Test
	public void testReservationFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.reservationFichier(p1, trans1, d1);
		ArrayList<Transport> transDeserialise = serveur.reconstruireTransports();
		
		int cap = 0;
		ArrayList<Trajet> trajetsTrans = trans1.getTrajets();
		for(int i=0; i<trajetsTrans.size(); i++){
			if(trajetsTrans.get(i).getDateDebut().equals(d1)){
				cap = trajetsTrans.get(i).getCapaciteCourante();
			}
		}
		
		int cap2=0;
		ArrayList<Trajet> trajetsTrans2 = transDeserialise.get(1).getTrajets();
		for(int i=0; i<trajetsTrans2.size(); i++){
			if(trajetsTrans2.get(i).getDateDebut().equals(d1)){
				cap = trajetsTrans2.get(i).getCapaciteCourante();
			}
		}
		assertEquals(cap, cap2);
	}

	/**
	 * Test method for {@link Serveur#getTransportsTypeFichier(Types)}.
	 */
	@Test
	public void testGetTransportsTypeFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);

		ArrayList<Transport> typesAvion = serveur.getTransportsTypeFichier(Types.AVION);
		assertEquals(2, typesAvion.size());	
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesDepartFichier(Villes)}.
	 */
	@Test
	public void testGetTransportsVillesDepartFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);
		ArrayList<Trajet> marseille = serveur.getTransportsVillesDepartFichier(Villes.MARSEILLE);
		assertEquals(3, marseille.size());	
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesArriveeFichier(Villes)}.
	 */
	@Test
	public void testGetTransportsVillesArriveeFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);
		ArrayList<Trajet> paris = serveur.getTransportsVillesArriveeFichier(Villes.PARIS);
		assertEquals(3, paris.size());
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesFichier(Villes, Villes)}.
	 */
	@Test
	public void testGetTransportsVillesFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);
		ArrayList<Trajet> parisnice = serveur.getTransportsVillesFichier(Villes.PARIS, Villes.NICE);
		assertEquals(2, parisnice.size());
	}

	/**
	 * Test method for {@link Serveur#getTransportsVillesDateDepartFichier(Villes, Villes, java.util.Date)}.
	 */
	@Test
	public void testGetTransportsVillesDateDepartFichier() {
		serveur.supprimerTout();
		serveur.ecrire(trans1, true);
		serveur.ecrire(trans2, true);
		serveur.ecrire(trans3, true);
		ArrayList<Trajet> parisniced1 = serveur.getTransportsVillesDateDepartFichier(Villes.PARIS, Villes.NICE,d1);
		assertEquals(0, parisniced1.size());
	}

}
